
Quelques solutions essayées pour afficher des pages html dans une fenêtre Java.


* La classe BasicHTML

	La méthode BasicHTML.createHTMLView (...) permet d'afficher une représentation pour le code html passé
	en paramètre. J'ai donc essayé de créer un panneau dont la méthode paintComponent() utilisait cette classe
	pour tracer son contenu.

	Exemple de code (dans la méthode paintComponent(Graphics g) d'un panneau)
	
		// (charger le code html depuis un fichier)
		...

		// Tracer la représentation du code HTML		
		View vueHTMLTest = BasicHTML.createHTMLView (this, chaineCodeHTML) ;
		vueHTMLTest.paint (g, new Rectangle (this.getWidth(), this.getHeight())) ;
		
	Problèmes rencontrés (et non résolus)

		- Le code html simple est bien affiché, mais des pages plus complexes ne s'affichent pas du tout.
		  Peut-être du code HTML mal interprété, peut-être que le code était simplement trop long.
		- Pas interactif : les liens sont bien représentés en bleu et soulignés, mais il ne s'agit que d'une
		  image, il n'est pas possible de cliquer sur les liens.
		- Dans mon test, la méthode paintComponent était appelée de très nombreuses fois. Un problème
		  d'utilsation de cette méthode de tracé ? En dessinant dans une image qui était ensuite affichée sur
		  le panneau à chaque fois que c'était nécessaire, ça n'a rien changé.


* Le composant WebBrowser du projet JDIC

	Le but du projet JDIC est de permettre aux programmes Java de s'intégrer au mieux avec l'environnement
	graphique de la plate-forme locale : accès au navigateur par défaut, ...
	Le composant WebBrowser permet d'utiliser un navigateur web dans une fenêtre Java.
	A priori ce composant se repose sur un navigateur local et sur des bibliothèques natives.

	Exemple de code
	
		WebBrowser navigateur = new WebBrowser() ;      
		navigateur.setURL (new URL (chaineURL)) ;

	Problèmes rencontrés (et non résolus)

		- Pas réussi à lui faire trouver les bibliothèques natives dont il a besoin, ce qui fait que la
		  création du composant lève une exception. Ce problème devrait cependant être surmontable.

	Avantages
	
		- Le composant devrait permettre d'afficher des pages complexes puisqu'il repose sur un navigateur
		  complet.

	Inconvénients
	
		- Le composant semble nécessiter qu'un navigateur supporté soit disponible (au moins Firefox et
		  Internet Explorer semblent supportés).
		- Le composant ne peut fonctionner que sur un système supporté, à cause des bibliothèques natives
		  (Linux et Windows semblent supportés mais c'est tout dans ce qui est livré avec le projet ; pas
		   de MacOS par exemple).


* La classe JEditorPane

	La classe JEditorPane permet d'afficher (et d'éditer ?) différents type de contenus : texte, rtf (limité),
	HTML (limité). Voir la javadoc de cette classe pour plus d'informations.
	D'après la Javadoc, HTML 3.2 serait supporté.

	Exemple de code
	
		// Créer le composant (il faut bien sûr l'ajouter à la fenêtre ensuite)
		this.ep_navigateur = new JEditorPane (chaineURL) ;
		this.ep_navigateur.setEditable (false) ;
		this.ep_navigateur.addHyperlinkListener (this) ;

		[...]
        
		// Méthode de gestion des événements sur les liens
		// Evénements : entrée, sortie (pour la détection du survol), activation (clic)
		// L'objet en paramètre permet de récupérer des informations sur le lien concerné (voir la javadoc)
		public void hyperlinkUpdate (HyperlinkEvent evt)
		{
			try
			{
				// Changer de page si on clique sur les liens (pas juste si on passe dessus)
				if (HyperlinkEvent.EventType.ACTIVATED.equals (evt.getEventType()))
					this.ep_navigateur.setPage (evt.getURL()) ;
			}
			catch (IOException e)
			{
				e.printStackTrace() ;
			}
		}
	
	Problèmes rencontrés (et non résolus)
		- Des comportements parfois étranges surviennent
		- Apparemment ce n'est pas possible d'utiliser plusieurs instances de cette classe en parallèle
		  (par exemple leur demander de s'afficher dans deux fils d'exécution séparés). Il y a des
		  interactions fâcheuses. Certains traitements semblent se mélanger (parce qu'ils se produisent
		  dans le fil d'exécution de Swing au lieu de se produire dans les fils dans lesquels ils sont
		  initiés ?)
		! Ces problèmes peuvent dépendre de la JVM utilisée.
        
	Avantages

		- Le composant est en Java et fait partie de l'API standard, donc il est toujours disponible et
		  devrait fonctionner quelle que soit la plate-forme (système, navigateurs installés, ...).
		- Le composant gère les événements sur les hyperliens. Assez simplement et de manière bien intégrée
		  au système d'événements de Java par ailleurs.

	Inconvénients

		- Le composant ne gère que le HTML 3.2 (ce qui est néanmoins suffisant pour afficher du texte mis en
		  page sous forme de pages HTML dans un programme).


* La bibliothèque de rendu HTML Cobra du navigateur web Lobo (écrit en Java)

	Cette solution n'a pas été essayée (trouvée plus tard), mais il semble que cette bibliothèque
	permette d'afficher des contenus HTML plus avancés que le composant intégré à Java JEditorPane)
	
	http://lobobrowser.org/java-browser.jsp
	http://lobobrowser.org/cobra.jsp
	
	! Attention à la question des licences
	
	Exemple de code
	
		! Voir sur le site de Cobra/Lobo
	
	Avantages

		- Devrait gérer le HTML 4
		- Composant assez complet (Cobra seule déjà), qui permet d'intercepter un certain nombre
		  d'événements lors du rendu ou des actions de l'utilisateur pour les traiter de manière
		  particulière
		- Le composant est écrit en pur Java, indépendant des navigateurs déjà installés
	
	Inconvénients

		- Gestion de HTML annoncée comme partielle (et le reste aussi, apparemment il reste pas mal
		  de bugs)
		- Les deux jars à utiliser pèsent environ 1,5 Mo
		? Projet encore maintenu ?

		
* D'autres composants (Sourceforge, ...) ?
    * DJNative, similaire au composant WebBrowser du projet JDIC dans le positionnement
    * ...
